home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / qbsnip.zip / WAVE.BAS < prev   
BASIC Source File  |  1997-06-19  |  6KB  |  239 lines

  1. 'Date: 11-23-96 (12:14)
  2. 'From: Dave Shea
  3. 'Subj: Wave.Bas (1 / 3)
  4.  
  5. ' DMAPlay by Mike Huff 1996
  6. DEFINT A-Z
  7. DECLARE FUNCTION DMADone% ()
  8. DECLARE FUNCTION ResetDSP% ()
  9. DECLARE SUB WriteDSP (byte%)
  10. DECLARE FUNCTION ReadDSP% ()
  11. DECLARE SUB WriteDAC (byte%)
  12. DECLARE SUB SpeakerState (OnOff%)
  13. DECLARE SUB DMAState (StopGo%)
  14. DECLARE FUNCTION ReadDAC% ()
  15. DECLARE SUB DMAPlay (Segment&, Offset&, Length&, Freq%)
  16. DECLARE SUB DMARecord (Segment&, Offset&, Length&, Freq%)
  17. DECLARE FUNCTION LSB% (LongByte&)
  18. DECLARE FUNCTION MSB% (LongByte&)
  19. DECLARE FUNCTION Page% (LongByte&)
  20. DECLARE SUB CalcIO (BasePort%)
  21. COMMON SHARED DSPReset%, DSPRead%, DSPWrite%, LenPort%
  22. COMMON SHARED DSPWriteStat%, DSPDataAvail%, Channel%
  23. DECLARE SUB CalcIO (BasePort%)
  24. DECLARE SUB DMAPlay (Segment&, Offset&, Length&, Freq%)
  25. DECLARE SUB SpeakerState (OnOff%)
  26. DIM SHARED Buffer(1 TO 1) AS STRING * 32767            'Strings are_
  27. ' unsigned chars
  28.    
  29.     WAVfile$ = "C:\windows\ding.wav"'RTRIM$(COMMAND$)
  30.     Hz = 22025                                  '11025, 22050
  31.     CalcIO &H220                                'Change to whatever yours is set at
  32.     Channel% = 1                                'Change to your DMA channel
  33.     OPEN WAVfile$ FOR BINARY AS #1              'Windows 3.1 Chimes.wav 22kHz
  34.     GET #1, 44, Buffer(1)                       'Skip the header and get samples from the file
  35.     Junk% = ResetDSP%                           'Reset the SBs Digital Signal Processor
  36.     SpeakerState 1                              'Turn on the speaker
  37.     DMAPlay VARSEG(Buffer(1)), VARPTR(Buffer(1)), LOF(1) - 44, Hz  'Play it!
  38.     DO
  39.     LOOP UNTIL DMADone%  ' Loops until file is done playing.
  40.     CLOSE #1
  41. DEFSNG A-Z
  42.  
  43.  
  44. SUB CalcIO (BasePort%)
  45. ' Calculate port addresses.
  46. IF BasePort% = 0 THEN EXIT SUB
  47. Bport$ = LTRIM$(HEX$(BasePort%))
  48. IF LEN(Bport$) <> 3 THEN EXIT SUB
  49. bp$ = "2" + MID$(Bport$, 2, 1)
  50. DSPReset% = VAL("&H" + bp$ + "6")
  51. DSPRead% = VAL("&H" + bp$ + "A")
  52. DSPWrite% = VAL("&H" + bp$ + "C")
  53. DSPWriteStat% = VAL("&H" + bp$ + "C")
  54. DSPDataAvail% = VAL("&H" + bp$ + "E")
  55.  
  56. END SUB
  57.  
  58. FUNCTION DMADone%
  59. Count% = INP(LenPort%)
  60. Count2% = INP(LenPort%)
  61. Count& = CLNG(Count% + 1) * CLNG(Count2% + 1)
  62. IF (Count& - 1) = &HFFFF& THEN Junk% = INP(DSPDataAvail%): DMADone% = -1
  63. END FUNCTION
  64.  
  65. SUB DMAPlay (Segment&, Offset&, Length&, Freq%)
  66. ' Transfers and plays the contents of the buffer.
  67. Length& = Length& - 1
  68. MemLoc& = Segment& * 16 + Offset&
  69. SELECT CASE Channel%
  70.     CASE 0
  71.        PgPort% = &H87
  72.        AddPort% = &H0
  73.        LenPort% = &H1
  74.        ModeReg% = &H48
  75.     CASE 1
  76.        PgPort% = &H83
  77.        AddPort% = &H2
  78.        LenPort% = &H3
  79.        ModeReg% = &H49
  80.     CASE 2
  81.        PgPort% = &H81
  82.        AddPort% = &H4
  83.        LenPort% = &H5
  84.        ModeReg% = &H4A
  85.     CASE 3
  86.        PgPort% = &H82
  87.        AddPort% = &H6
  88.        LenPort% = &H7
  89.        ModeReg% = &H4B
  90.     CASE ELSE
  91.        PRINT "Sorry this library does not support the 16 bit channels.";
  92.        EXIT SUB
  93. END SELECT
  94.  
  95. OUT &HA, &H4 + Channel%
  96. OUT &HC, &H0
  97. OUT &HB, ModeReg%
  98. OUT AddPort%, LSB%(MemLoc&)
  99. OUT AddPort%, MSB%(MemLoc&)
  100. OUT PgPort%, Page%(MemLoc&)
  101. OUT LenPort%, LSB%(Length&)
  102. OUT LenPort%, MSB%(Length&)
  103. OUT &HA, Channel%
  104.  
  105. TimeConst% = INT(256 - 1000000 \ Freq%)
  106. WriteDSP &H40
  107. WriteDSP TimeConst%
  108. WriteDSP &H14
  109. WriteDSP LSB%(Length&)
  110. WriteDSP MSB%(Length&)
  111.  
  112. END SUB
  113.  
  114. SUB DMARecord (Segment&, Offset&, Length&, Freq%)
  115. Length& = Length& - 1
  116. MemLoc& = Segment& * 16 + Offset&
  117. SELECT CASE Channel%
  118.     CASE 0
  119.        PgPort% = &H87
  120.        AddPort% = &H0
  121.        LenPort% = &H1
  122.        ModeReg% = &H44
  123.     CASE 1
  124.        PgPort% = &H83
  125.        AddPort% = &H2
  126.        LenPort% = &H3
  127.        ModeReg% = &H45
  128.     CASE 2
  129.        PgPort% = &H81
  130.        AddPort% = &H4
  131.        LenPort% = &H5
  132.        ModeReg% = &H46
  133.     CASE 3
  134.        PgPort% = &H82
  135.        AddPort% = &H6
  136.        LenPort% = &H7
  137.        ModeReg% = &H47
  138.     CASE ELSE
  139.        EXIT SUB
  140. END SELECT
  141.  
  142. OUT &HA, &H4 + Channel%
  143. OUT &HC, &H0
  144. OUT &HB, ModeReg%
  145. OUT AddPort%, LSB%(MemLoc&)
  146. OUT AddPort%, MSB%(MemLoc&)
  147. OUT PgPort%, Page%(MemLoc&)
  148. OUT LenPort%, LSB%(Length&)
  149. OUT LenPort%, MSB%(Length&)
  150. OUT &HA, Channel%
  151.  
  152. TimeConst% = INT(256 - 1000000 \ Freq%)
  153. WriteDSP &H40
  154. WriteDSP TimeConst%
  155. WriteDSP &H24
  156. WriteDSP LSB%(Length&)
  157. WriteDSP MSB%(Length&)
  158.  
  159. END SUB
  160.  
  161. SUB DMAState (StopGo%)
  162. ' Stops or continues DMA play.
  163. IF StopGo% THEN WriteDSP &HD4 ELSE WriteDSP &HD0
  164. END SUB
  165.  
  166. FUNCTION LSB% (LongByte&)
  167. ' Gets the LSB of a long integer.
  168. LSB% = LongByte& AND &HFF&
  169.  
  170. END FUNCTION
  171.  
  172. FUNCTION MSB% (LongByte&)
  173. ' Gets the MSB from a long integer.
  174. MSB% = (LongByte& AND &HFFFF&) \ &H100
  175.  
  176. END FUNCTION
  177.  
  178. FUNCTION Page% (LongByte&)
  179. ' Gets the memory page of the buffer.
  180. IF (LongByte& AND 65536) THEN P% = P% + 1
  181. IF (LongByte& AND 131072) THEN P% = P% + 2
  182. IF (LongByte& AND 262144) THEN P% = P% + 4
  183. IF (LongByte& AND 524288) THEN P% = P% + 8
  184. Page% = P%
  185. END FUNCTION
  186.  
  187. FUNCTION ReadDAC%
  188. ' Reads a byte from the DAC.
  189. WriteDSP &H20
  190. ReadDAC% = ReadDSP%
  191.  
  192. END FUNCTION
  193.  
  194. FUNCTION ReadDSP%
  195. ' Reads a byte from the DSP
  196. DO
  197. LOOP UNTIL INP(DSPDataAvail%) AND &H80
  198. ReadDSP% = INP(DSPDataAvail%)
  199.  
  200. END FUNCTION
  201.  
  202. FUNCTION ResetDSP%
  203. ' Resets the DSP
  204. OUT DSPReset%, 1
  205. Junk% = INP(DSPReset%)
  206. Junk% = INP(DSPReset%)
  207. Junk% = INP(DSPReset%)
  208. Junk% = INP(DSPReset%)
  209. OUT DSPReset%, 0
  210. IF INP(DSPDataAvail%) AND &H80 = &H80 AND INP(DSPRead%) = &HAA THEN
  211.    ResetDSP% = -1
  212. ELSE
  213.    ResetDSP% = 0
  214. END IF
  215.  
  216. END FUNCTION
  217.  
  218. SUB SpeakerState (OnOff%)
  219. ' Turns speaker on or off.
  220. IF OnOff% THEN WriteDSP &HD1 ELSE WriteDSP &HD3
  221.  
  222. END SUB
  223.  
  224. SUB WriteDAC (byte%)
  225. ' Writes a byte to the DAC.
  226. WriteDSP &H10
  227. WriteDSP byte%
  228.  
  229. END SUB
  230.  
  231. SUB WriteDSP (byte%)
  232. ' Writes a byte to the DSP
  233. DO
  234. LOOP WHILE INP(DSPWriteStat%) AND &H80
  235. OUT DSPWrite%, byte%
  236.  
  237. END SUB
  238.  
  239.